// NOWHINE NC009 <- Shared file with system team so uses non-CamX file naming
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  anr10setting.h
/// @brief ANR1_0 module setting calculation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef ANR10SETTING_H
#define ANR10SETTING_H

#include "ipe_data.h"
#include "iqcommondefs.h"
#include "iqsettingutil.h"
#include "anr_1_0_0.h"
#include "ANR_Chromatix.h"
#include "ANR_Registers.h"
#include "NcLibContext.h"


/// @brief Unpacked Data for ANR10 Module
// NOWHINE NC004c: Share code with system team
struct ANR10UnpackedField
{
    UINT16          enable;                      ///< Module enable flag
    ANR_REG_PASS    regPassData[PASS_TYPE_NUM];  ///< unpacked register data
};

CAMX_STATIC_ASSERT(sizeof(ANR10UnpackedField) == ANRUNPACKSIZE);
CAMX_STATIC_ASSERT((sizeof(ANR_Chromatix) * PASS_TYPE_NUM) == ANRCHROMATIX);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class that implements ANR10 module setting calculation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// NOWHINE NC004c: Share code with system team
class ANR10Setting
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CalculateHWSetting
    ///
    /// @brief  Calculate the unpacked register value
    ///
    /// @param  pInput   Pointer to the input data
    /// @param  pData    Pointer to the interpolation result
    /// @param  pOutput  Pointer to the unpacked data
    ///
    /// @return TRUE for success
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL CalculateHWSetting(
        const ANR10InputData*                                 pInput,
        anr_1_0_0::mod_anr10_cct_dataType::cct_dataStruct*    pData,
        anr_1_0_0::chromatix_anr10_reserveType*               pReserveData,
        anr_1_0_0::chromatix_anr10Type::enable_sectionStruct* pModuleEnable,
        VOID*                                                 pOutput);

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// MapChromatix2ANRChromatix
    ///
    /// @brief  Map Chromatix Input to ANR defined chromatix data
    ///
    /// @param  pReserveData   Pointer to the input chromatix reserve data
    /// @param  pUnpackedData  Pointer to the input unpacked data
    /// @param  passNumMax     Maximum number of pass types used
    /// @param  pANRChromatix   Pointer to the output ANR chromatix data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static VOID MapChromatix2ANRChromatix(
        anr_1_0_0::mod_anr10_pass_reserve_dataType*        pReserveData,
        anr_1_0_0::mod_anr10_cct_dataType::cct_dataStruct* pUnpackedData,
        UINT32                                             passNumMax,
        ANR_Chromatix*                                     pANRChromatix);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CopyANRFwParamsToPcsimRegs
    ///
    /// @brief  Map ANR parameters to Register parameters
    ///
    /// @param  pInput             Pointer to Input data
    /// @param  pFwStruct          Pointer to the ANR pass data
    /// @param  pChromatixStruct   Pointer to the refinement data
    /// @param  pRegStruct         Pointer to the ANR register data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static VOID CopyANRFwParamsToPcsimRegs(
        const ANR10InputData* pInput,
        AnrParameters*        pFwStruct,
        ANR_Chromatix*        pChromatixStruct,
        ANR_REG_PASS*         pRegStruct);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateGeometryParameters
    ///
    /// @brief  Update the geometry Parameters
    ///
    /// @param  pInput           Pointer to the input data
    /// @param  pNclibContext    Pointer to nclib context
    ///
    /// @return TRUE for success
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL UpdateGeometryParameters(
        const ANR10InputData* pInput,
        NCLIB_CONTEXT_ANR*    pNclibContext);
};
#endif // ANR10SETTING_H
